#include "include.h"
#include "iis_audio_out.h"

#if I2S_TX_AUDIO_EN

#define IIS_TX_CIRBUF_SIZE  2048
uint8_t iis_tx_pool[IIS_TX_CIRBUF_SIZE] AT(.iis_buf);
uint16_t iis_tx_pool_out[128] AT(.iis_buf);
static iis_tx_cfg_t iis_tx_cfg;
#define IIS_DMA_SAMPLES   64
#define IIS_DMABUF_LEN     (IIS_DMA_SAMPLES * 2 * 2 *4)  //tx,rx double_buf, one_sample_4byte
u8 iis_dmabuf[IIS_DMABUF_LEN]AT(.iis_buf);   //若iis_cfg.mode中有RAMTX或RAMRX,需要该dmabuf做中断缓存
iis_cfg_t iis_cfg;
AT(.com_text.iis_tx)WEAK
void iis_tx_audio_input(u8 *ptr, u32 samples, int ch_mode, void *params)
{
    cbuf_cfg_t *src_cbuf_t = &iis_tx_cfg.iis_tx_cbuf;
    if ((!iis_tx_cfg.mute)) {
        cbuf_input_audio((u8 *)ptr, samples, src_cbuf_t);
    }
    if (iis_tx_cfg.callback) {
        iis_tx_cfg.callback(ptr, samples, ch_mode, params);
    }
}


AT(.text.iis_tx)WEAK
void iis_tx_audio_output_callback_set(audio_callback_t callback)
{
    iis_tx_cfg.callback = callback;
}

AT(.text.iis_tx)
void iis_tx_pool_init(u8 sample_rate, u16 samples)
{
    my_printf("iis_tx_pool_init\r\n");
    memset(&iis_tx_cfg, 0, sizeof(iis_tx_cfg));
    memset(&iis_tx_pool, 0, sizeof(iis_tx_pool));
    cbuf_init(&(iis_tx_cfg.iis_tx_cbuf), iis_tx_pool, IIS_TX_CIRBUF_SIZE);
}

AT(.com_text.iis_ext)
void iis_ram_tx_process(void *buf, u32 samples, bool iis_32bit)
{
    u32 *ptr_cache = (u32 *)buf;
    memset(buf,0,samples);
    if (iis_32bit) {   //32_bit时,要做16位扩展到32位,samples需要减半
        samples = samples / 2;
    }
    cbuf_cfg_t *src_cbuf_t = &iis_tx_cfg.iis_tx_cbuf;
    if(cbuf_total_samples_get(src_cbuf_t) >= samples){
        cbuf_output_audio((u8 *)iis_tx_pool_out, samples, src_cbuf_t);

            for (int i = 0; i< samples;i++) {
            if (iis_32bit) {
                ptr_cache[2*i] = iis_tx_pool_out[i]<<16;     //16->32位扩展
                ptr_cache[2*i+1] =iis_tx_pool_out[i]<<16;   //部分样机取后16位
            } else {

            }
        }
    } else {
        for (int i = 0; i< samples;i++) {
            if (iis_32bit) {
                ptr_cache[2*i] = 0x00<16;     //16->32位扩展
                ptr_cache[2*i+1] =0x00<<16;   //部分样机取后16位
            } else {

            }
        }

    }
}

void iis_audio_out_init(void)
{
    printf("%s\n",__func__);
    memset(&iis_cfg,0x00, sizeof(iis_cfg));
    iis_cfg.mode        = IIS_MASTER_RAMTX; //IIS_MASTER_SRCTX //IIS_SLAVE_RAMTX
    iis_cfg.iomap       = I2S_MAPPING_SEL;
    iis_cfg.bit_mode    = I2S_BIT_MODE;
    iis_cfg.data_mode   = I2S_DATA_MODE;
    iis_cfg.mclk_sel    = I2S_MCLK_SEL;
    iis_cfg.mclk_out_en = IIS_MCLK_OUT_DIS;

    if (iis_cfg.mode & IISCFG_DMA) {
        printf("iis_dma config run\n");
        iis_cfg.dma_cfg.samples = IIS_DMA_SAMPLES;
        iis_cfg.dma_cfg.dmabuf_ptr = iis_dmabuf;
        iis_cfg.dma_cfg.dmabuf_len = IIS_DMABUF_LEN;
        iis_cfg.dma_cfg.iis_isr_rx_callbck = NULL;  //iis_rx接收完一个DMA后起中断,回调该函数,可以从buf中取出接收到数据
        iis_cfg.dma_cfg.iis_isr_tx_callbck = iis_ram_tx_process;  //iis_tx发送完一个DMA后起中断,要求向buf中填入数据,以备下一次发送
    }
    iis_cfg_init(&iis_cfg);
    memset(&iis_dmabuf, 0, sizeof(iis_dmabuf));
    iis_start();
}
#endif // I2S_TX_AUDIO_EN

